package com.example.demo.algorithm.unique_id;

import java.util.UUID;


/**
 * UUID （Universally Unique Identifier），通用唯一识别码的缩写。UUID是由一组32位数的16进制数字所构成，所以UUID理论上的总数为 16^32=2^128，约等于 3.4 x 10^38。
 * 也就是说若每纳秒产生1兆个UUID，要花100亿年才会将所有UUID用完。生成的UUID是由 8-4-4-4-12格式的数据组成，其中32个字符和4个连字符' - '，
 * 一般我们使用的时候会将连字符删除 uuid.toString().replaceAll("-","")。
 * 目前UUID的产生方式有5种版本，每个版本的算法不同，应用范围也不同。基于时间的UUID
 * - 版本1： 这个一般是通过当前时间，随机数，和本地Mac地址来计算出来，可以通过 org.apache.logging.log4j.core.util包中的 UuidUtil.getTimeBasedUuid()来使用或者其他包中工具。
 * 由于使用了MAC地址，因此能够确保唯一性，但是同时也暴露了MAC地址，私密性不够好。DCE安全的UUID
 * - 版本2 DCE（Distributed Computing Environment）安全的UUID和基于时间的UUID算法相同，但会把时间戳的前4位置换为POSIX的UID或GID。
 * 这个版本的UUID在实际中较少用到。基于名字的UUID（MD5）
 * - 版本3 基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了：相同名字空间中不同名字生成的UUID的唯一性；
 * 不同名字空间中的UUID的唯一性；相同名字空间中相同名字的UUID重复生成是相同的。随机UUID
 * - 版本4 根据随机数，或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的，但是重复的可能性可以忽略不计，因此该版本也是被经常使用的版本。JDK中使用的就是这个版本。
 * 基于名字的UUID（SHA1）
 * - 版本5 和基于名字的UUID算法类似，只是散列值计算使用SHA1（Secure Hash Algorithm 1）算法。
 *
 * 虽然 UUID 生成方便，本地生成没有网络消耗，但是使用起来也有一些缺点，
 * 1.不易于存储：UUID太长，16字节128位，通常以36长度的字符串表示，很多场景不适用。
 * 2.信息不安全：基于MAC地址生成UUID的算法可能会造成MAC地址泄露，暴露使用者的位置。
 * 3.对MySQL索引不利：如果作为数据库主键，在InnoDB引擎下，UUID的无序性可能会引起数据位置频繁变动，严重影响性能，可以查阅 Mysql 索引原理 B+树的知识

 * ------
 * 著作权归@pdai所有
 * 原文链接：https://pdai.tech/md/arch/arch-z-id.html
 */
public class UUIDClass {
    public static void main(String[] args) {
        //获取一个版本4根据随机字节数组的UUID。
        UUID uuid = UUID.randomUUID();
        System.out.println(uuid.toString().replace("-", ""));

        //获取一个版本3(基于名称)根据指定的字节数组的UUID。
        byte[] nByte = {10,20,30};
        UUID uuid1 = UUID.nameUUIDFromBytes(nByte);
        System.out.println(uuid1.toString().replace("-", ""));
    }
}
